﻿using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Controllers;
using Interfaces;
using Utilities;


namespace Views.Moduler
{
    public partial class Afdelinger
    {
        #region Fields

        private readonly Controller _controller;
        private IAfdeling _selectedAfdeling;

        #endregion

        #region Creation

        public Afdelinger(Controller controller)
        {
            InitializeComponent();
            _controller = controller;

            // gør filen tilgængelig i XAML delen
            DataContext = this;

            OpdaterAfdelingsListView();
        }

        #endregion

        #region Events

        private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var afdeling = (IAfdeling)ListViewAfdelinger.SelectedItem;
            _selectedAfdeling = afdeling;

            var lukketAfdeling = _controller.HentDefaultAfdeling();

            if (_selectedAfdeling != null)
            {
                if (_selectedAfdeling.Navn == lukketAfdeling.Navn)
                {
                    BtnVisBruger.IsEnabled = false;
                    BtnSlet.IsEnabled = false;
                    BtnRediger.IsEnabled = false;
                }
                else
                {
                    AfdelingValgt();
                }
            }
        }

        //Dobbelt klik på musen åbner detaljer op for en afdeling
        private void ListViewAfdelinger_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            VisBruger_Click(null, new RoutedEventArgs());
        }

        private void VisBruger_Click(object sender, RoutedEventArgs e)
        {
            IAfdeling lukketAfdeling = _controller.HentDefaultAfdeling();

            //Hvis der ikke er valgt et afdelings objekt returner metoden
            if (_selectedAfdeling == null || _selectedAfdeling.Navn == lukketAfdeling.Navn) return;

            var afdelingsDetaljer = new AfdelingsDetaljer(_controller, _selectedAfdeling);
            afdelingsDetaljer.ShowDialog();
        }

        private void BtnOpret_Click(object sender, RoutedEventArgs e)
        {
            var formular = new Form();
            formular.BtnSubmit = "Tilføj afdeling";
            formular.Title = "Tilføj afdeling";

            formular.CreateTextBox("navn", "Afdelingens navn:");

            var window = new FormWindow(formular);
            if (window.ShowDialog() == true)
            {
                string navn = (string)formular.Result["navn"];
                if (navn.IsValidStringAndHasMaxLengthOf(25))
                {
                    bool opdateret = _controller.TilføjAfdeling(navn);
                    if (opdateret)
                    {
                        OpdaterAfdelingsListView();
                    }
                    else
                    {
                        MessageBox.Show("Der skete en fejl.",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                    }
                }
                else
                {
                    string validationError = "";

                    if (!navn.IsValidString())
                    {
                        validationError += "Du skal udfylde afdelingens navn. ";
                    }
                    else
                    {
                        if (!navn.IsValidStringAndHasMaxLengthOf(25))
                        {
                            validationError += "Afdelingens navn må maks være 25 tegn. ";
                        }
                    }

                    if (!validationError.IsValidString()) return;

                    MessageBox.Show(validationError);
                }
            }
        }

        // event handler til sletning af afdeling.
        private void BtnSlet_Click(object sender, RoutedEventArgs e)
        {
            var lukketAfdeling = _controller.HentDefaultAfdeling();

            // der skal være valgt en afdeling
            if (_selectedAfdeling == null || _selectedAfdeling.Navn == lukketAfdeling.Navn) return;


            if (ListViewAfdelinger.SelectedItems.Count == 1)
            {
                if (MessageBox.Show("Er du sikker på at du vil slette afdeling " +
                                            _selectedAfdeling.Navn + "?",
                                            "Vil du slette?", MessageBoxButton.OKCancel, MessageBoxImage.Warning) ==
                            MessageBoxResult.OK)
                {
                    bool slettet = _controller.FjernAfdeling(_selectedAfdeling);

                    if (slettet)
                    {
                        OpdaterAfdelingsListView();
                    }
                    else
                    {
                        MessageBox.Show("Fejl ved sletning af afdeling.");
                    }
                }
            }
            else if (ListViewAfdelinger.SelectedItems.Count > 1)
            {
                bool annulleret = false;
                bool fjernet = false;

                foreach (var afdeling in ListViewAfdelinger.SelectedItems)
                {
                    var tmpAfdeling = (IAfdeling)afdeling;
                    if (MessageBox.Show("Er du sikker på at du vil slette afdeling " +
                                        tmpAfdeling.Navn + "?",
                                        "Vil du slette?", MessageBoxButton.OKCancel, MessageBoxImage.Warning) ==
                        MessageBoxResult.OK)
                    {
                        fjernet = _controller.FjernAfdeling(tmpAfdeling);
                    }
                    else
                    {
                        annulleret = true;
                    }
                }
                if (fjernet)
                {
                    OpdaterAfdelingsListView();
                }
                else if (!annulleret)
                {
                    MessageBox.Show("Fejl ved sletning af afdeling.");
                }
            }
        }

        // event handler til visning af groupbox 
        private void BtnRediger_Click(object sender, RoutedEventArgs e)
        {
            var lukketAfdeling = _controller.HentDefaultAfdeling();

            if (_selectedAfdeling != null && _selectedAfdeling.Navn != lukketAfdeling.Navn)
            {
                var formular = new Form();
                formular.BtnSubmit = "Opdater";
                formular.Title = "Opdater " + _selectedAfdeling.Navn;

                formular.CreateTextBox("navn", "Afdelingens navn:", _selectedAfdeling.Navn, true);

                var window = new FormWindow(formular);
                if (window.ShowDialog() == true)
                {
                    string navn = (string)formular.Result["navn"];

                    if (navn.IsValidString())
                    {
                        bool opdateret = _controller.RedigerAfdeling(_selectedAfdeling, navn);
                        if (opdateret)
                        {
                            OpdaterAfdelingsListView();
                        }
                        else
                        {
                            MessageBox.Show("Der skete en fejl.",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        }
                    }
                    else
                    {
                        string validationError = "";

                        if (!navn.IsValidString())
                        {
                            validationError += "Du skal udfylde afdelingens navn. ";
                        }
                        else
                        {
                            if (!navn.IsValidStringAndHasMaxLengthOf(25))
                            {
                                validationError += "Afdelingens navn må maks være 25 tegn. ";
                            }
                        }

                        if (!validationError.IsValidString()) return;

                        MessageBox.Show(validationError);
                    }
                 }
            }
        }

        #endregion

        #region Tilstandsstyring

        public void OpdaterSide()
        {
            ListViewAfdelinger.SelectedItem = null;
            BtnVisBruger.IsEnabled = false;
            BtnRediger.IsEnabled = false;
            BtnSlet.IsEnabled = false;
            OpdaterAfdelingsListView();
        }

        private void OpdaterAfdelingsListView()
        {
            ListViewAfdelinger.ItemsSource = _controller.HentAlleAfdelinger();
        }

        private void AfdelingValgt()
        {
            BtnVisBruger.IsEnabled = true;
            BtnRediger.IsEnabled = true;
            BtnSlet.IsEnabled = true;
        }

        #endregion
    }
}
